<?php

//#########################################################################
//
//     com_myrss_rssfilter
//
// (C) Copyright by Hachreak
//       17/dic/07 - 23:52:15
//       Released under GPL v2.
//       Author : Hachreak (hachreak at gmail dot com)
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//
//#########################################################################

defined('_VALID_MOS') or die('Access Denied');

// libreria di utilita'
require_once($mosConfig_absolute_path.'/components/com_myrss_rssfilter/dec.html.php');
// libreria per la gestione degli Rss e Atom
require_once($mosConfig_absolute_path.'/components/com_myrss_rssfilter/simplepie/simplepie.inc');

// ultima versione
$LAST_VERSION = "1.1.0";
// link dove trovare l'ultima versione
$LAST_VERSION_WWW = "http://code.google.com/p/myrss-project/";//"http://www.secondlifelab.it/index.php?option=com_remository&Itemid=77&func=select&id=5";
// Lunghezza max del messaggio di risposta
$MAX_LENGTH_MSG = 2048;
// Url dell'rss di default
$DEFAULT_URL = "http://www.secondlifelab.it/index.php?option=com_rss&feed=RSS2.0&no_html=1";
// tabella dove sono salvate le statistiche
$MYRSS_TABLE = "#__myrss_rssfilter";
//tabella con info aggiuntive
$MYRSS_TABLE_PLUSINFO = "#__myrss_rssfilter_plusinfo";

// Get the operation to do
$op = mosGetParam($_GET,"op","");

function adobeNews($title, $body, $link){
	global $MAX_LENGTH_MSG;

	// elimino spazi e \n che non servono
	$body = str_replace(array("  ","\n\n"," \n"),array(" ","\n","\n"),$body);

	$out  = "\n-\t-\t-\t\n";
	$out .= strtoupper($title)."\n";
	$out .= "-\t-\t-\t\n";
	 
	$out .= $body;

	$puntini = "(...)";
	$read_more = "\n\nRead more: ".html_entity_decode($link);
	
	$length_str = strlen($out);
	$length_tail = strlen($puntini) + strlen($read_more);

	# elimina il superfluo
	$out = substr($out, 0, $MAX_LENGTH_MSG - $length_tail);

	# se il messaggio e' stato tagliato, aggiunti i puntini di sospensione
	if($length_str > strlen($out)){
		$out .= $puntini;
	}

	# Aggiungi il "read more"
	$out .= $read_more;

	return $out;
}

/**
 * Gestisce la richiesta della versione odierna
 *
 * @return string
 */
function alertForLastVersion(){
	global $LAST_VERSION,$LAST_VERSION_WWW;
	// Ottengo la versione del client
	$version = mosGetParam($_GET,"version","");
	 
	$out = "MYrss last version: ".$LAST_VERSION."\n";
	 
	// se non e' l'ultima versione, diglielo!
	if($version != $LAST_VERSION){
		// Avverti che e' presente una versione piu' recente
		$out .= "\n Your version is old!\n";
		$out .= "Download last version: ".$LAST_VERSION_WWW."\n";
	}
	 
	return $out;
}

/**
 * Ottieni le statistiche riferite a quel url
 *
 * @param string $url
 */
function getLastStat($url){
	global $database, $MYRSS_TABLE;

	$query = "
		SELECT * 
		FROM $MYRSS_TABLE
		WHERE url LIKE '$url'
	";

	$database->setQuery($query);
	$obj = $database->loadObjectList();

	if(($obj === null) || (count($obj) == 0))
		return null;
		
	return $obj[0];
}

/**
 * Statistiche
 *
 */
class myrss_stat{
	// url dell'rss richiesto
	var $url = "";
}

/**
 * Statistiche aggiuntive
 */
class myrss_plusinfo{
	// richieste dei titoli delle news
	var $titles = 0;
	// richieste del corpo di una news
	var $news = 0;
	// richieste x l'ultima versione
	var $last_version = 0;
	// richieste che hanno ritornato errore
	var $error = 0;
	// versione del client lsl
	var $version = "";
	// regione in cui si trovava il client al momento della richiesta
	var $region = "";
	// coordinate in cui si trovava il client al momento della richiesta
	var $coo_x = 0;
	var $coo_y = 0;
	var $coo_z = 0;
	// Data in cui e' stata fatta la richiesta
	var $date;
	// id dell'rss richiesto
	var $id_myrss;
}

// Get the url of RSS
$url = decode_url(mosGetParam($_GET,"url",$DEFAULT_URL));

// Oggetto per le statistiche
$notExist = false;
if(($stat = getLastStat($url)) === null){
	$stat = new myrss_stat();
	$notExist = true;
}

// TODO salva le statistiche aggiuntive
$stat_plus = new myrss_plusinfo();

// TODO salvo le statistiche
$stat->url = $url;

switch($op){

	case 'version':
		// visualizza l'ultima versione disponibile
		echo alertForLastVersion();
		 
		// TODO salva le statistiche
		$stat_plus->last_version = 1;
		break;

	default:
		// leggi le news
		$feed = new SimplePie();
		//set dell'url del feed
		$feed->set_feed_url($url);
		// ordina x data
		$feed->enable_order_by_date(true);
		// faccio il parsing
		$feed->init();
		// setto il content type della pagina
		$feed->handle_content_type();
				
		// controllo se c'e' stato qualche problema
		if ($feed->error()){
			header ("HTTP/1.0 501 Error in elaboration");
			// TODO salva le statistiche
			$stat_plus->error++;
		}else{			
			// sono stati richiesti i titoli o una news  
			switch($op){
				case 'body':
					// Get the number of news to read
					$number = mosGetParam($_GET,"number",0);
						
					// read the news number $number
					$news = $feed->get_item($number); 					
	
					// visualizzo la news (eliminando tutti i tag html)
					echo adobeNews(
						convert_enc_chars($news->get_title()),
						convert_enc_chars(
							strip_tags( 
								$news->get_content()
							)
						),
						$news->get_permalink()
					);
      
					// TODO salva le statistiche
					$stat_plus->news++;

					break;
      
				default:
					// Get the number of titles to read
					$number = mosGetParam($_GET,"number",0);
					
					// Read the news titles
					$title = "";
					$i = 0;
					foreach($feed->get_items() as $news){
						if(($number == 0) || ($i<$number))
							$title .= convert_enc_chars($news->get_title())."\n";
							
						$i++;
					}
					echo $title;
      
					// TODO salva le statistiche
					$stat_plus->titles++;
      
					break;
			}
		}
		break;
}

// salvo statistiche aggiuntive
$stat_plus->region = mosGetParam($_GET,"region","");
$stat_plus->coo_x = mosGetParam($_GET,"coo_x",0);
$stat_plus->coo_y = mosGetParam($_GET,"coo_y",0);
$stat_plus->coo_z = mosGetParam($_GET,"coo_z",0);
$stat_plus->version = mosGetParam($_GET,"version","");
$stat_plus->date = date("Y-n-j H:i:s");

// salvo le statistiche nel database
global $database;
if($notExist){
	// inserisco le nuove stat
	$database->insertObject($MYRSS_TABLE, $stat);
	
	// set dell'id del feed a cui sono associate
	$stat_plus->id_myrss = $database->insertid();	
}else{
	// aggiorno le nuove stat
	$database->updateObject($MYRSS_TABLE, $stat, "id");
	
	// set dell'id del feed a cui sono associate
	$stat_plus->id_myrss = $stat->id;
}

// insreisco le nuove stat aggiuntive
$database->insertObject($MYRSS_TABLE_PLUSINFO, $stat_plus);

// chiudo la connessione!
die();

?>
